1 program problem209 (input
, output
);
6 PosIzq
, //La posición del punto contando desde el primer elemento de la izquierda de la fila
7 PosDcha
//Lo mismo pero empezando por la derecha
12 i
, j
, Distancia1
: integer;
14 Puntos
: Array[0..5] of TPunto
; //los puntos en el orden en que entran
15 PuntosOrdenados
: Array[0..5] of TPunto
; //los puntos ordenados de mayor a menor
16 Cuenta
: Integer; //Cuenta el numero de puntos que le entraron - 1 (Porque el arreglo empieza en 0)
17 TempPt
: TPunto
; //Pt temporal usado para organizarlos de mayor a menor
19 PtsCorrectos
: Set of Byte;
21 Function StrToInt(Const S
: String): Integer;
28 procedure PrintIncorrectos();
31 for i
:= 0 to Cuenta
do
32 Write(Puntos
[i
].Num
, ' ');
33 WriteLn('are not the vertices of an acceptable figure');
36 procedure PrintCorrecto(Figura
: String);
39 for i
:= 0 to Cuenta
do
40 Write(Puntos
[i
].Num
, ' ');
41 WriteLn('are the vertices of a '+Figura
);
44 function GetFila(Numero
: Integer) : Integer;
45 //retorna la fila de un numero o punto
56 Result
:= Fila
; //Return
59 function GetSumaDeFilas(Cuantas
: Integer) : Integer;
60 //retorna la suma de todas las filas hasta Cuantas
65 For i
:= 1 to Cuantas
do
69 function GetPosIzq(Numero
, Fila
: Integer) : Integer;
70 //retorna la posición izquierda respecto a la fila
72 Result
:= Numero
- (GetSumaDeFilas(Fila
)-Fila
);
75 function GetPosDcha(Numero
, Fila
: Integer) : Integer;
76 //retorna la posición derecha respecto a la fila
78 Result
:= GetSumaDeFilas(Fila
) - Numero
+ 1;
83 PtsCorrectos
:= [3, 4, 6];
85 while not eof(input
) do
87 FillChar(Puntos
, SizeOf(Puntos
), 0); //Limpia el arreglo y lo llena todo con 0's
90 If Length(Entrada
) = 0 then Break
; //si no introducen ningun caracter entonces salir
91 If Entrada
[Length(Entrada
)] <> ' ' then Entrada
:= Entrada
+ ' '; //Agrega un espacio al final para poder "parsear" todos los numeros
92 While Pos(' ', Entrada
) > 0 do
95 Puntos
[Cuenta
].Num
:= StrToInt(Copy(Entrada
, 1, Pos(' ', Entrada
)-1));
96 Delete(Entrada
, 1, Pos(' ', Entrada
));
98 //Aquí ya he leído todos los puntos y están en el arreglo Puntos. La variable Cuenta contiene el numero de elementos que hay
100 if not ((Cuenta
+1) in PtsCorrectos
) then //No son 3, 4 o 6 pts, entonces es incorrecto
103 Continue
; //Salta al pròximo while
106 for i
:= 0 to Cuenta
do
108 Puntos
[i
].Fila
:= GetFila(Puntos
[i
].Num
);
109 Puntos
[i
].PosIzq
:= GetPosIzq(Puntos
[i
].Num
, Puntos
[i
].Fila
);
110 Puntos
[i
].PosDcha
:= GetPosDcha(Puntos
[i
].Num
, Puntos
[i
].Fila
);
113 FillChar(PuntosOrdenados
, SizeOf(PuntosOrdenados
), 0);
114 //Organizarlos de mayor a menor
116 for i
:= 0 to Cuenta
do
117 PuntosOrdenados
[i
] := Puntos
[i
]; //copia el arreglo
119 for i
:= 0 to Cuenta
do
121 for j
:= Cuenta
downto i
+1 do
123 if PuntosOrdenados
[j
].Num
< PuntosOrdenados
[j
-1].Num
then
125 TempPt
:= PuntosOrdenados
[j
];
126 PuntosOrdenados
[j
] := PuntosOrdenados
[j
-1];
127 PuntosOrdenados
[j
-1] := TempPt
;
131 //Aqui se encuentran todos los puntos organizados de mayor a menor en el arreglo PuntosOrdenados
135 /////////////////////////////////////////////
136 ////////////// Triangulo ////////////////////
137 /////////////////////////////////////////////
139 3: //Triangulo : Hay 2 Tipos: \/ y /_\
141 if PuntosOrdenados
[0].Fila
= PuntosOrdenados
[1].Fila
then //Tipo 1: Los dos primeros puntos estan en la misma fila
143 Distancia1
:= PuntosOrdenados
[0].PosDcha
- PuntosOrdenados
[1].PosDcha
;
144 if (PuntosOrdenados
[2].PosDcha
= PuntosOrdenados
[0].PosDcha
)
145 and (PuntosOrdenados
[2].PosIzq
= PuntosOrdenados
[1].PosIzq
)
146 and ((PuntosOrdenados
[2].Fila
- PuntosOrdenados
[0].Fila
) = Distancia1
) then
148 PrintCorrecto('triangle');
157 else if PuntosOrdenados
[1].Fila
= PuntosOrdenados
[2].Fila
then //Tipo 2: El 2do y 3er punto estan en la misma fila
159 Distancia1
:= PuntosOrdenados
[1].PosDcha
- PuntosOrdenados
[2].PosDcha
;
160 if (PuntosOrdenados
[1].PosIzq
= PuntosOrdenados
[0].PosIzq
)
161 and (PuntosOrdenados
[2].PosDcha
= PuntosOrdenados
[0].PosDcha
)
162 and ((PuntosOrdenados
[2].Fila
- PuntosOrdenados
[0].Fila
)=Distancia1
) then
164 PrintCorrecto('triangle');
173 else //No hay 2 puntos en la misma fila
180 /////////////////////////////////////////////
181 ////////////// Paralelogramo ////////////////
182 /////////////////////////////////////////////
186 if PuntosOrdenados
[0].Fila
= PuntosOrdenados
[1].Fila
then // tipo /_/ o \_\
188 Distancia1
:= PuntosOrdenados
[0].PosDcha
- PuntosOrdenados
[1].PosDcha
;
189 if ((PuntosOrdenados
[2].PosIzq
= PuntosOrdenados
[0].PosIzq
)
190 and (PuntosOrdenados
[3].PosIzq
= PuntosOrdenados
[1].PosIzq
)
191 and ((PuntosOrdenados
[2].Fila
-PuntosOrdenados
[0].Fila
)=Distancia1
))
193 ((PuntosOrdenados
[2].PosDcha
= PuntosOrdenados
[0].PosDcha
)
194 and (PuntosOrdenados
[3].PosDcha
= PuntosOrdenados
[1].PosDcha
)
195 and ((PuntosOrdenados
[2].Fila
-PuntosOrdenados
[0].Fila
)=Distancia1
)) then
197 PrintCorrecto('parallelogram');
206 else if PuntosOrdenados
[1].Fila
= PuntosOrdenados
[2].Fila
then // tipo \/
208 Distancia1
:= PuntosOrdenados
[1].Fila
- PuntosOrdenados
[0].Fila
;
209 if (PuntosOrdenados
[1].PosIzq
= PuntosOrdenados
[0].PosIzq
)
210 and (PuntosOrdenados
[2].PosDcha
= PuntosOrdenados
[0].PosDcha
)
211 and ((PuntosOrdenados
[3].Fila
-PuntosOrdenados
[1].Fila
)=Distancia1
)
212 and (PuntosOrdenados
[3].PosDcha
= PuntosOrdenados
[1].PosDcha
)
213 and (PuntosOrdenados
[3].PosIzq
= PuntosOrdenados
[2].PosIzq
) then
215 PrintCorrecto('parallelogram');
232 /////////////////////////////////////////////
233 /////////////// Hexagono ////////////////////
234 /////////////////////////////////////////////
237 begin //Solo hay un tipo posible
238 Distancia1
:= PuntosOrdenados
[0].PosDcha
- PuntosOrdenados
[1].PosDcha
;
239 if (PuntosOrdenados
[0].Fila
= PuntosOrdenados
[1].Fila
)
240 and (PuntosOrdenados
[2].PosIzq
= PuntosOrdenados
[0].PosIzq
)
241 and (PuntosOrdenados
[3].PosDcha
= PuntosOrdenados
[1].PosDcha
)
242 and (PuntosOrdenados
[2].Fila
- PuntosOrdenados
[0].Fila
= Distancia1
)
243 and (PuntosOrdenados
[4].PosDcha
= PuntosOrdenados
[2].PosDcha
)
244 and (PuntosOrdenados
[5].PosIzq
= PuntosOrdenados
[3].PosIzq
)
245 and (PuntosOrdenados
[4].Fila
- PuntosOrdenados
[2].Fila
= Distancia1
) then
247 PrintCorrecto('hexagon');